Spring 5 এবং Spring WebFlux এ WebClient এর ব্যবহার

Java Technologies - স্প্রিং বুট ক্লায়েন্ট (Spring Boot Client) WebClient এর পরিচিতি |
75
75

Spring 5 থেকে WebClient ইন্ট্রোডিউস করা হয়েছে, যা Spring WebFlux-এর অংশ। এটি একটি নন-ব্লকিং, রিয়াক্টিভ HTTP ক্লায়েন্ট এবং RestTemplate-এর আধুনিক বিকল্প হিসেবে ব্যবহৃত হয়। WebClient Spring 5 থেকে শুরু করে রিয়াক্টিভ এবং ব্লকিং উভয় ধরনের API কলের জন্য ব্যবহার করা যায়।


WebClient কেন ব্যবহার করবেন?

  1. নন-ব্লকিং এবং রিয়াক্টিভ প্রকৃতি:
    • WebClient সম্পূর্ণরূপে নন-ব্লকিং I/O ব্যবহার করে, যা উচ্চ কর্মক্ষমতা প্রদান করে।
    • এটি Reactive Streams-এর উপর ভিত্তি করে কাজ করে।
  2. RestTemplate-এর বিকল্প:
    • RestTemplate একটি ব্লকিং ক্লায়েন্ট, যেখানে WebClient নন-ব্লকিং ও আরও দক্ষ।
  3. সার্ভিস-টু-সার্ভিস কমিউনিকেশন:
    • মাইক্রোসার্ভিস আর্কিটেকচারে উচ্চ-দক্ষ HTTP ক্লায়েন্ট।
  4. আধুনিক API:
    • JSON, XML, এবং অন্যান্য ডেটা ফরম্যাটের জন্য সহজ হ্যান্ডলিং।

WebClient যোগ করার জন্য Dependency

pom.xml এ নিচের নির্ভরতা যোগ করুন:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

WebClient-এর বেসিক ব্যবহার

১. WebClient তৈরি:

WebClient তৈরি করার দুটি প্রধান পদ্ধতি আছে:

  • ১.১ Default Instance: সরাসরি WebClient তৈরি করা।
WebClient webClient = WebClient.create();
  • ১.২ Base URL সহ তৈরি করা:
WebClient webClient = WebClient.builder()
                                .baseUrl("https://api.example.com")
                                .build();

২. API কল করার পদ্ধতি:

২.১ GET Request:

import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;

@Service
public class ApiClient {
    private final WebClient webClient;

    public ApiClient(WebClient.Builder webClientBuilder) {
        this.webClient = webClientBuilder.baseUrl("https://api.example.com").build();
    }

    public String getData(String endpoint) {
        return this.webClient.get()
                .uri(endpoint) // "/data"
                .retrieve()
                .bodyToMono(String.class) // Reactive Type
                .block(); // Blocking call
    }
}

২.২ POST Request:

public String postData(String endpoint, Object requestBody) {
    return this.webClient.post()
            .uri(endpoint)
            .bodyValue(requestBody) // Request Body
            .retrieve()
            .bodyToMono(String.class)
            .block();
}

৩. নন-ব্লকিং রিয়াক্টিভ কল (Reactive API):

নন-ব্লকিং পদ্ধতিতে block() না করে Reactive Streams ব্যবহার করা হয়।

public Mono<String> getReactiveData(String endpoint) {
    return this.webClient.get()
            .uri(endpoint)
            .retrieve()
            .bodyToMono(String.class); // Returns Mono<String>
}

WebClient কনফিগারেশন

Timeout কনফিগার করা:

WebClient webClient = WebClient.builder()
    .baseUrl("https://api.example.com")
    .clientConnector(new ReactorClientHttpConnector(
        HttpClient.create().responseTimeout(Duration.ofSeconds(5))
    ))
    .build();

Header যোগ করা:

public String getDataWithHeaders(String endpoint) {
    return this.webClient.get()
            .uri(endpoint)
            .header("Authorization", "Bearer some-token")
            .header("Custom-Header", "value")
            .retrieve()
            .bodyToMono(String.class)
            .block();
}

Error Handling:

public String getDataWithErrorHandling(String endpoint) {
    return this.webClient.get()
            .uri(endpoint)
            .retrieve()
            .onStatus(HttpStatus::is4xxClientError, clientResponse -> {
                return Mono.error(new RuntimeException("4xx Error"));
            })
            .onStatus(HttpStatus::is5xxServerError, clientResponse -> {
                return Mono.error(new RuntimeException("5xx Error"));
            })
            .bodyToMono(String.class)
            .block();
}

Reactive API Response Types

  • Mono: একটি অবজেক্ট রিটার্ন করে।
  • Flux: একাধিক অবজেক্ট রিটার্ন করে।

উদাহরণ:

public Flux<String> getMultipleData(String endpoint) {
    return this.webClient.get()
            .uri(endpoint)
            .retrieve()
            .bodyToFlux(String.class); // Reactive Flux
}

WebClient-এর সাহায্যে ফাইল ডাউনলোড:

public Mono<Void> downloadFile(String fileUrl, String destination) {
    return this.webClient.get()
            .uri(fileUrl)
            .retrieve()
            .bodyToMono(byte[].class)
            .doOnNext(bytes -> {
                try {
                    Files.write(Paths.get(destination), bytes);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            })
            .then();
}

WebClient-এর সুবিধা

  1. নন-ব্লকিং ও পারফরম্যান্স:
    • নন-ব্লকিং I/O ব্যবহারে কর্মক্ষমতা বৃদ্ধি।
  2. Reactive Streams সাপোর্ট:
    • Mono এবং Flux-এর মাধ্যমে স্ট্রিমিং ডেটা ম্যানেজমেন্ট।
  3. ব্যবহার সহজ:
    • RestTemplate থেকে আরও ফিচার-সমৃদ্ধ এবং সহজ API।
  4. Header এবং Authorization সহজ হ্যান্ডলিং:
    • OAuth2, JWT, এবং অন্যান্য নিরাপত্তা ফিচার সহজে ইন্টিগ্রেট করা যায়।

Spring WebFlux-এর WebClient একটি আধুনিক HTTP ক্লায়েন্ট যা RestTemplate-এর তুলনায় আরও দক্ষ এবং রিয়াক্টিভ মডেলের জন্য আদর্শ। এটি মাইক্রোসার্ভিস এবং ক্লাউড-নেটিভ অ্যাপ্লিকেশনের জন্য বিশেষভাবে উপযোগী।

Content added By
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion